﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using estudent.Models;
using System.Text.RegularExpressions;

namespace estudent.Controllers
{
    public class IzpitniRokController : Controller
    {

        estudentEnt db = null;
        IEnumerable<sPredmeti> predmeti = null;
        IEnumerable<SProfesorji> profesorji = null;

        //
        // GET: /IzpitniRok/

        public ActionResult Index()
        {
            ViewData["drugiIzvajalci"] = "";

            db = new estudentEnt();
            string role = Session["Role"].ToString();

            if (role.CompareTo("refe") == 0)
            {
                predmeti = from p in db.sPredmetis
                           select p;

                profesorji = from p in db.SProfesorjis
                            orderby p.priimekProfesor, p.imeProfesor
                           select p;

                string text = "<tr><td align='right'><label>Profesor: </label></td><td><select name='profesor' id='profesor'>";
                text+="<option value='prazen'>Izberite profesorja</option>";
                foreach (var p in profesorji)
                {
                    text += "<option value='"+p.sProfesor+"'>"+p.priimekProfesor+" "+p.imeProfesor+" - "+p.sProfesor+"</option>";
                }
                text += "</select></td></tr>";
                ViewData["profesorji"] = text;
                
            }
            else if (role.CompareTo("prof") == 0)
            {
                Decimal idProf = Convert.ToDecimal(Session["Name"]);

                IEnumerable<Poucuje> predmeti1 = db.Poucujes.Where(p => p.sProfesor1 == idProf || p.sProfesor2 == idProf || p.sProfesor3 == idProf).Select(g => g);
                IEnumerable<sPredmeti> predmeti = from p in db.sPredmetis
                                                  join p1 in predmeti1 on p.sPredmeta equals p1.sPredmeta
                                                  select p;
                predmeti = predmeti.Distinct();
                ViewData["predmeti"]=predmeti;           
            }

            
            
            return View("IzpitniRok");
        }



        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Vnos(FormCollection form)
        {
            Session["temp"] = form["imePredmeta"];

            if (!Regex.IsMatch(form["max"], @"^[0-9]+$"))
                ModelState.AddModelError("max", "Polje [Največje število točk] mora imeti številke.");
            if (!Regex.IsMatch(form["meja"], @"^[0-9]+$"))
                ModelState.AddModelError("meja", "Polje [Število točk za pozitivno oceno] mora imeti številke.");
            if (form["profesor"] != null)
            {
                if (form["profesor"].CompareTo("prazen") == 0)
                    ModelState.AddModelError("profesor", "Polje [Profesor] je prazno");
            }
            if (form["imePredmeta"].CompareTo("prazen") == 0)
                ModelState.AddModelError("imePredmeta", "Polje [Predmet] je prazno");

            if (ModelState.IsValid)
            {

                db = new estudentEnt();

                int ura = Convert.ToInt32(form["ura"]);
                int minuta = Convert.ToInt32(form["minuta"]);
                int dan = Convert.ToInt32(form["dan"]);
                int mesec = Convert.ToInt32(form["mesec"]);
                int leto = Convert.ToInt32(form["leto"]);
                string pred = form["predavalnica"];
                Decimal idPredmet = Decimal.Parse(form["imePredmeta"]);

                string role = Session["Role"].ToString();

                IzpitniRoki rok = new IzpitniRoki();
                DateTime dat = new DateTime(leto, mesec, dan, ura, minuta, 0);
                rok.datumRoka = dat;
                rok.prostor = pred;
                rok.maxTock = Decimal.Parse(form["max"]);
                rok.pozitivnaMeja = Decimal.Parse(form["meja"]);
                //if (form["profesor2"] != null && form["profesor2"].CompareTo("prazen")!=0)
               //     rok. = Decimal.Parse(form["profesor2"]);
               // if (form["profesor3"] != null && form["profesor3"].CompareTo("prazen") != 0)
               //     rok.sProfesor3 = Decimal.Parse(form["profesor3"]);


                decimal idProf;
                decimal? idProf2 = null;
                decimal? idProf3 = null;

                SProfesorji profesor;
                Poucuje pouc = null;
                IEnumerable<Poucuje> poucujes = null;

                if (role.CompareTo("refe") == 0)
                {
                    idProf = Decimal.Parse(form["profesor"]);
                    profesor = db.SProfesorjis.FirstOrDefault(p => p.sProfesor == idProf);


                    if (form["profesor2"] != null && form["profesor2"].CompareTo("prazen")!=0)
                        idProf2 = Decimal.Parse(form["profesor2"]);
                    //if (form["profesor3"] != null && form["profesor3"].CompareTo("prazen") != 0)
                     //   idProf3 = Decimal.Parse(form["profesor3"]);

                    if(idProf2==null)
                        pouc = db.Poucujes.FirstOrDefault(p => (p.sProfesor1 == idProf) && p.sPredmeta == idPredmet);
                    else if(idProf2!=null)
                        pouc = db.Poucujes.FirstOrDefault(p => p.idPoucuje==idProf2);

                    //poucujes = db.Poucujes.Where(p => p.sPredmeta == idPredmet && (p.sProfesor1 == idProf || p.sProfesor2 == idProf || p.sProfesor3 == idProf));


                }
                else if (role.CompareTo("prof") == 0)
                {

                    idProf = Decimal.Parse(Session["Name"].ToString());
                    profesor = db.SProfesorjis.First(p => p.sProfesor == idProf);

                    if (form["profesor2"] != null && form["profesor2"].CompareTo("prazen") != 0)
                        idProf2 = Decimal.Parse(form["profesor2"]);

                    if (idProf2 == null)
                        pouc = db.Poucujes.FirstOrDefault(p => (p.sProfesor1 == idProf) && p.sPredmeta == idPredmet);
                    else if (idProf2 != null)
                        pouc = db.Poucujes.FirstOrDefault(p => p.idPoucuje==idProf2);

                }

                //sPredmeti predm = db.sPredmetis.FirstOrDefault(p => p.sPredmeta == idPredmet);
                //predm.IzpitniRokis.Add(rok);

                try
                {

                    pouc.IzpitniRokis.Add(rok);

                    //preverimo ce ze obstaja rok, ki ga je dolocila mozna kombinacija profesorjev
                    IzpitniRoki aliObstaja = db.IzpitniRokis.FirstOrDefault(i => i.idPoucuje==pouc.idPoucuje && i.datumRoka == rok.datumRoka);
                    if (aliObstaja != null)
                        throw new Exception();

                    db.AddToIzpitniRokis(rok);
                    db.SaveChanges();
                }
                catch (Exception)
                {

                    ViewData["uspeh"] = false;
                    ViewData["sporocilo"] = "Rok se ni uspešno shranil. Že obstaja rok na ta datum z nosilci tega predmeta.";
                    return View("Rezultat");
                }
                ViewData["uspeh"] = true;
                ViewData["sporocilo"] = "Rok se je uspešno shranil.";
                return View("Rezultat");
            }
            else
            {
                db = new estudentEnt();
                string role = Session["Role"].ToString();

                ViewData["predmet"] = form["imePredmeta"];
                ViewData["max"]=form["max"];
                ViewData["meja"]=form["meja"];
                ViewData["ura"] = form["ura"];
                ViewData["minuta"] = form["minuta"];
                ViewData["dan"] = form["dan"];
                ViewData["mesec"] = form["mesec"];
                ViewData["leto"] = form["leto"];
                ViewData["pred"] = form["predavalnica"];

                if (role.CompareTo("refe") == 0)
                {
                    predmeti = from p in db.sPredmetis
                               select p;

                    profesorji = from p in db.SProfesorjis
                                 orderby p.priimekProfesor
                                 select p;

                    decimal izbran = (form["profesor"].CompareTo("prazen")!=0)? Decimal.Parse(form["profesor"]) : 0;

                    string text = "<tr><td align='right'><label>Profesor: </label></td><td><select name='profesor' id='profesor'>";
                    text += "<option value='prazen'>Izberite profesorja</option>";
                    foreach (var p in profesorji)
                    {
                        if(izbran==p.sProfesor)
                            text += "<option selected='selected' value='" + p.sProfesor + "'>" + p.priimekProfesor + " " + p.imeProfesor + " - " + p.sProfesor + "</option>";
                        else
                            text += "<option value='" + p.sProfesor + "'>" + p.priimekProfesor + " " + p.imeProfesor + " - " + p.sProfesor + "</option>";
                    }
                    text += "</select></td></tr>";
                    ViewData["profesorji"] = text;


                }
                else if (role.CompareTo("prof") == 0)
                {
                    Decimal idProf = Convert.ToDecimal(Session["Name"]);

                    IEnumerable<Poucuje> predmeti1 = db.Poucujes.Where(p => p.sProfesor1 == idProf || p.sProfesor2 == idProf || p.sProfesor3 == idProf).Select(g => g);

                    IEnumerable<sPredmeti> predmeti = from p in db.sPredmetis
                                                      join p1 in predmeti1 on p.sPredmeta equals p1.sPredmeta
                                                      select p;
                    predmeti = predmeti.Distinct();

                    ViewData["predmeti"] = predmeti;
                }
                return View("IzpitniRok",form);
            }
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string Poisci(FormCollection form)
        {
            db = new estudentEnt();

            int sifraProf = Int32.Parse(form["profesor"]);

            IEnumerable<Poucuje> predmeti1 = db.Poucujes.Where(p => (p.sProfesor1 == sifraProf || p.sProfesor2 == sifraProf || p.sProfesor3 == sifraProf)&&(p.veljavnost==null||p.veljavnost==true));

            IEnumerable<sPredmeti> predmeti = from p in db.sPredmetis
                                              join p1 in predmeti1 on p.sPredmeta equals p1.sPredmeta
                                              select p;
            predmeti = predmeti.Distinct();

            string izhod = "<option value=\"prazen\">Izberite predmet</option>";

            foreach (var ele in (IEnumerable<sPredmeti>)predmeti)
            {

                izhod += ("<option value=\"" + ele.sPredmeta + "\">" + ele.imePredmeta + " - " + ele.sPredmeta + "</option>");
            }

            return izhod;
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string soProfesorji(FormCollection form)
        {
            db = new estudentEnt();
            string role = Session["Role"].ToString();

            string select = "<label>Možne kombinacije z izvajalci predmeta:</label>";
            select += "<select name='profesor2' id='drugiProfesor'>";

            

            string izhod = "";
            if (role.CompareTo("refe") == 0)
            {
                decimal prof = Decimal.Parse(form["profesor"]);
                decimal sPred=Decimal.Parse(form["imePredmeta"]);

                //Poucuje pouc = db.Poucujes.FirstOrDefault(p => (p.sProfesor1 == prof || p.sProfesor2 == prof || p.sProfesor3 == prof) && p.sPredmeta == sPred);

                IEnumerable<Poucuje> kjeVsePouc = db.Poucujes.Where(p => (p.sProfesor1 == prof || p.sProfesor2 == prof || p.sProfesor3 == prof) && p.sPredmeta == sPred && (p.veljavnost==null || p.veljavnost==true));

                foreach (var pouc in kjeVsePouc)
                {
                    string profesorji=pouc.SProfesorji1.priimekProfesor+" "+pouc.SProfesorji1.imeProfesor;
                    profesorji+=(pouc.SProfesorji2!=null) ? ", "+pouc.SProfesorji2.priimekProfesor+" "+pouc.SProfesorji2.imeProfesor : "";
                    profesorji += (pouc.SProfesorji != null) ? ", " + pouc.SProfesorji.priimekProfesor + " " + pouc.SProfesorji.imeProfesor : "";
                    select += "<option value='" + pouc.idPoucuje + "'>"+profesorji+ "</option>";
                }
                select += "</select>";
                izhod = select;

                if (kjeVsePouc.Count() == 1)
                {
                    Poucuje t = kjeVsePouc.FirstOrDefault(p => (p.sProfesor1 == prof || p.sProfesor2 == prof || p.sProfesor3 == prof) && (p.veljavnost == null || p.veljavnost == true));
                    if (t.sProfesor2 == null && t.sProfesor3 == null)
                        izhod = "";


                }
                
            }
            else if (role.CompareTo("prof") == 0)
            {
                decimal prof = Decimal.Parse(Session["Name"].ToString());
                decimal sPred = Decimal.Parse(form["imePredmeta"]);

                IEnumerable<Poucuje> kjeVsePouc = db.Poucujes.Where(p => (p.sProfesor1 == prof || p.sProfesor2 == prof || p.sProfesor3 == prof) && p.sPredmeta == sPred && (p.veljavnost == null || p.veljavnost == true));

                foreach (var pouc in kjeVsePouc)
                {
                    string profesorji = pouc.SProfesorji1.priimekProfesor + " " + pouc.SProfesorji1.imeProfesor;
                    profesorji += (pouc.SProfesorji2 != null) ? ", " + pouc.SProfesorji2.priimekProfesor + " " + pouc.SProfesorji2.imeProfesor : "";
                    profesorji += (pouc.SProfesorji != null) ? ", " + pouc.SProfesorji.priimekProfesor + " " + pouc.SProfesorji.imeProfesor : "";
                    select += "<option value='" + pouc.idPoucuje + "'>" + profesorji + "</option>";
                }
                select += "</select>";
                izhod = select;


                if (kjeVsePouc.Count() == 1)
                {
                    Poucuje t = kjeVsePouc.FirstOrDefault(p => (p.sProfesor1 == prof || p.sProfesor2 == prof || p.sProfesor3 == prof) && (p.veljavnost == null || p.veljavnost == true));
                    if (t.sProfesor2 == null && t.sProfesor3 == null)
                        izhod = "";


                }

            }



            return izhod;
        }


        public string getSession()
        {
            return (Session["temp"]!=null) ? Session["temp"].ToString() : "prazen";
        }

    }
}
